home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Icon 8.1 / msm-2 / iconc.sit / err.c next >
Encoding:
C/C++ Source or Header  |  1992-09-19  |  9.2 KB  |  302 lines  |  [TEXT/MPS ]

  1. /*
  2.  * err.c -- routines for producing error messages.
  3.  */
  4.  
  5. #include "::h:gsupport.h"
  6. #include "token.h"
  7. #include "tlex.h"
  8. #include "trans.h"
  9. #include "tree.h"
  10. #include "tcode.h"
  11. #include "tsym.h"
  12. #include "tproto.h"
  13.  
  14. /*
  15.  * Prototype.
  16.  */
  17.  
  18. char    *mapterm    Params((int typ,struct node *val));
  19.  
  20. static struct errmsg {
  21.    int    e_state;        /* parser state number */
  22.    char *e_mesg;        /* message text */
  23.    } errtab[] = {
  24.  
  25. /*
  26.  * Initialization of table that maps error states to messages.
  27.  */
  28.  
  29.      0, "global, record, or procedure declaration expected",
  30.      1, "end of file expected",
  31.      2, "global, record, or procedure declaration expected",
  32.     11, "missing record name",
  33.     12, "missing semicolon",
  34.     13, "invalid global declaration",
  35.     14, "link list expected",
  36.     15, "operation list expected",
  37.     16, "missing procedure name",
  38.     17, "global, record, or procedure declaration expected",
  39.     21, "invalid global declaration",
  40.     32, "missing field list in record declaration",
  41.     34, "missing end",
  42.     35, "missing semicolon or operator",
  43.     50, "invalid operand for unary operator",
  44.     51, "invalid operand for unary operator",
  45.     52, "invalid operand for unary operator",
  46.     53, "invalid operand for unary operator",
  47.     54, "invalid operand for unary operator",
  48.     55, "invalid operand for unary operator",
  49.     56, "invalid operand for unary operator",
  50.     57, "invalid operand for unary operator",
  51.     58, "invalid operand for unary operator",
  52.     59, "invalid operand for unary operator",
  53.     60, "invalid operand for unary operator",
  54.     61, "invalid operand for unary operator",
  55.     62, "invalid operand for unary operator",
  56.     63, "invalid operand for unary operator",
  57.     64, "invalid operand for unary operator",
  58.     65, "invalid operand for unary operator",
  59.     66, "invalid operand for unary operator",
  60.     67, "invalid operand for unary operator",
  61.     68, "invalid operand for unary operator",
  62.     69, "invalid operand for unary operator",
  63.     70, "invalid operand for unary operator",
  64.     71, "invalid operand for unary operator",
  65.     72, "invalid operand for unary operator",
  66.     73, "invalid operand for unary operator",
  67.     83, "invalid create expression",
  68.     86, "invalid break expression",
  69.     87, "invalid expression",
  70.     88, "invalid compound expression",
  71.     89, "invalid expression",
  72.     90, "invalid keyword construction",
  73.     96, "invalid return expression",
  74.     97, "invalid suspend expression",
  75.     98, "invalid if control expression",
  76.     99, "invalid case control expression",
  77.    100, "invalid while control expression",
  78.    101, "invalid until control expression",
  79.    102, "invalid every control expression",
  80.    103, "invalid repeat expression",
  81.    106, "missing link file name",
  82.    107, "missing operation name",
  83.    108, "number of arguments missing",
  84.    109, "missing parameter list in procedure declaration",
  85.    111, "missing end",
  86.    112, "identifier expected",
  87.    113, "invalid initial expression",
  88.    118, "missing end",
  89.    119, "invalid operand",
  90.    120, "invalid operand",
  91.    121, "invalid operand in assignment",
  92.    122, "invalid operand in assignment",
  93.    123, "invalid operand in assignment",
  94.    124, "invalid operand in assignment",
  95.    125, "invalid operand in augmented assignment",
  96.    126, "invalid operand in augmented assignment",
  97.    127, "invalid operand in augmented assignment",
  98.    128, "invalid operand in augmented assignment",
  99.    129, "invalid operand in augmented assignment",
  100.    130, "invalid operand in augmented assignment",
  101.    131, "invalid operand in augmented assignment",
  102.    132, "invalid operand in augmented assignment",
  103.    133, "invalid operand in augmented assignment",
  104.    134, "invalid operand in augmented assignment",
  105.    135, "invalid operand in augmented assignment",
  106.    136, "invalid operand in augmented assignment",
  107.    137, "invalid operand in augmented assignment",
  108.    138, "invalid operand in augmented assignment",
  109.    139, "invalid operand in augmented assignment",
  110.    140, "invalid operand in augmented assignment",
  111.    141, "invalid operand in augmented assignment",
  112.    142, "invalid operand in augmented assignment",
  113.    143, "invalid operand in augmented assignment",
  114.    144, "invalid operand in augmented assignment",
  115.    145, "invalid operand in augmented assignment",
  116.    146, "invalid operand in augmented assignment",
  117.    147, "invalid operand in augmented assignment",
  118.    148, "invalid operand in augmented assignment",
  119.    149, "invalid operand in augmented assignment",
  120.    150, "invalid operand in augmented assignment",
  121.    151, "invalid operand in augmented assignment",
  122.    152, "invalid operand in augmented assignment",
  123.    153, "invalid to clause",
  124.    154, "invalid operand in alternation",
  125.    155, "invalid operand",
  126.    156, "invalid operand",
  127.    157, "invalid operand",
  128.    158, "invalid operand",
  129.    159, "invalid operand",
  130.    160, "invalid operand",
  131.    161, "invalid operand",
  132.    162, "invalid operand",
  133.    163, "invalid operand",
  134.    164, "invalid operand",
  135.    165, "invalid operand",
  136.    166, "invalid operand",
  137.    167, "invalid operand",
  138.    168, "invalid operand",
  139.    169, "invalid operand",
  140.    170, "invalid operand",
  141.    171, "invalid operand",
  142.    172, "invalid operand",
  143.    173, "invalid operand",
  144.    174, "invalid operand",
  145.    175, "invalid operand",
  146.    176, "invalid operand",
  147.    177, "invalid operand",
  148.    178, "invalid operand",
  149.    179, "invalid operand",
  150.    180, "invalid operand",
  151.    181, "invalid operand",
  152.    182, "invalid operand",
  153.    183, "missing right bracket",
  154.    184, "missing right brace",
  155.    185, "missing right parenthesis",
  156.    186, "invalid field name",
  157.    213, "missing right parenthesis",
  158.    215, "missing right brace",
  159.    216, "missing semicolon or operator",
  160.    217, "missing right bracket",
  161.    223, "missing then",
  162.    224, "missing of",
  163.    229, "missing identifier",
  164.    234, "missing right parenthesis",
  165.    236, "missing end",
  166.    237, "invalid declaration",
  167.    238, "missing semicolon or operator",
  168.    304, "missing right bracket",
  169.    307, "missing right brace",
  170.    309, "missing right parenthesis",
  171.    312, "missing right parenthesis or right bracket",
  172.    314, "missing right brace",
  173.    316, "invalid do clause",
  174.    317, "invalid then clause",
  175.    318, "missing left brace",
  176.    319, "invalid do clause",
  177.    320, "invalid do clause",
  178.    321, "invalid do clause",
  179.    323, "invalid argument list",
  180.    329, "invalid by clause",
  181.    331, "invalid section",
  182.    336, "missing right brace",
  183.    342, "invalid case clause",
  184.    347, "missing right bracket",
  185.    349, "missing right bracket",
  186.    351, "invalid else clause",
  187.    352, "missing right brace or semicolon",
  188.    354, "missing colon",
  189.    355, "missing colon",
  190.    360, "invalid case clause",
  191.    361, "invalid default clause",
  192.    362, "invalid case clause",
  193.     -1,  "syntax error"
  194.    };
  195.  
  196. /*
  197.  * yyerror produces syntax error messages.  tok is the offending token
  198.  *  (yychar), lval is yylval, and state is the parser's state.
  199.  *
  200.  * errtab is searched for the state, if it is found, the associated
  201.  *  message is produced; if the state isn't found, "syntax error"
  202.  *  is produced.
  203.  */
  204. novalue yyerror(tok, lval, state)
  205. int tok, state;
  206. nodeptr lval;
  207.    {
  208.    register struct errmsg *p;
  209.  
  210.  
  211.    if (tok_loc.n_file)
  212.       fprintf(stderr, "File %s; ", tok_loc.n_file);
  213.    if (tok == EOFX)   /* special case end of file */
  214.       fprintf(stderr, "unexpected end of file\n");
  215.    else {
  216.       fprintf(stderr, "Line %d # ", Line(lval));
  217.       if (Col(lval))
  218.          fprintf(stderr, "\"%s\": ", mapterm(tok,lval));
  219.       for (p = errtab; p->e_state != state && p->e_state >= 0; p++) ;
  220.       fprintf(stderr, "%s\n", p->e_mesg);
  221.       }
  222.    tfatals++;
  223.    }
  224.  
  225. /*
  226.  * tfatal produces the translator error messages s1 and s2 (if nonnull).  The
  227.  *  location of the error is found in tok_loc.
  228.  */
  229. novalue tfatal(s1, s2)
  230. char *s1, *s2;
  231.    {
  232.  
  233.    if (tok_loc.n_file)
  234.       fprintf(stderr, "File %s; ", tok_loc.n_file);
  235.    fprintf(stderr, "Line %d # ", tok_loc.n_line);
  236.    if (s2)
  237.       fprintf(stderr, "\"%s\": ", s2);
  238.    fprintf(stderr, "%s\n", s1);
  239.    tfatals++;
  240.    }
  241.  
  242. /*
  243.  * nfatal produces the error messages s1 and s2 (if nonnull), and associates
  244.  *  it with source location of node.
  245.  */
  246. novalue nfatal(n, s1, s2)
  247. nodeptr n;
  248. char *s1, *s2;
  249.    {
  250.  
  251.    if (n != NULL) {
  252.       fprintf(stderr, "File %s; ", File(n));
  253.       fprintf(stderr, "Line %d # ", Line(n));
  254.       }
  255.    if (s2)
  256.       fprintf(stderr, "\"%s\": ", s2);
  257.    fprintf(stderr, "%s\n", s1);
  258.    tfatals++;
  259.    }
  260.  
  261. /*
  262.  * twarn produces s1 and s2 (if nonnull) as translator warning messages.
  263.  *  The location of the error is found in tok_loc.
  264.  */
  265. novalue twarn(s1, s2)
  266. char *s1, *s2;
  267.    {
  268.  
  269.    if (tok_loc.n_file)
  270.       fprintf(stderr, "File %s; ", tok_loc.n_file);
  271.    fprintf(stderr, "Line %d # ", tok_loc.n_line);
  272.    if (s2)
  273.       fprintf(stderr, "\"%s\": ", s2);
  274.    fprintf(stderr, "%s\n", s1);
  275.    twarns++;
  276.    }
  277.  
  278. /*
  279.  * mapterm finds a printable string for the given token type
  280.  *  and value.
  281.  */
  282. static char *mapterm(typ,val)
  283. int typ;
  284. nodeptr val;
  285.    {
  286.    register struct toktab *t;
  287.    register struct optab *ot;
  288.    register int i;
  289.  
  290.    i = typ;
  291.    if (i == IDENT || i == INTLIT || i == REALLIT || i == STRINGLIT ||
  292.       i == CSETLIT)
  293.          return Str0(val);
  294.    for (t = toktab; t->t_type != 0; t++)
  295.       if (t->t_type == i)
  296.          return t->t_word;
  297.    for (ot = optab; ot->tok.t_type != 0; ot++)
  298.       if (ot->tok.t_type == i)
  299.          return ot->tok.t_word;
  300.    return "???";
  301.    }
  302.